import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.sql.Time;

public class RegisterUI extends JFrame {
    private JTextField userIdField;       // 用户ID输入框
    private JTextArea publicKeyArea;      // 显示公钥的文本框
    private JTextArea privateKeyArea;     // 显示私钥的文本框
    private JButton registerButton;       // 注册按钮
    private JButton exitButton;           // 退出按钮
    private JButton broadcastKeyButton;   // 广播公钥按钮

    public RegisterUI() {
        // 设置窗体的标题
        setTitle("注册界面");

        // 设置窗体的大小
        setSize(400, 300);

        // 使用 BoxLayout 进行垂直布局
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

        // 创建用户ID标签和输入框
        JPanel userIdPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel userIdLabel = new JLabel("用户ID:");
        userIdField = new JTextField(20);  // 设置输入框宽度为20个字符
        userIdPanel.add(userIdLabel);
        userIdPanel.add(userIdField);

        JPanel tipPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel tipLabel = new JLabel("（用户只需要输入用户ID，公私钥对为系统生成不需要键入）");
        tipPanel.add(tipLabel);

        // 创建公钥和私钥的显示区域
        JPanel publicKeyPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel publicKeyLabel = new JLabel("公钥:   ");
        publicKeyArea = new JTextArea(2, 35); // 多行文本框，2行，35列
        publicKeyArea.setEditable(false);     // 设置为只读
        JScrollPane publicKeyScroll = new JScrollPane(publicKeyArea);
        publicKeyPanel.add(publicKeyLabel);
        publicKeyPanel.add(publicKeyScroll);

        JPanel privateKeyPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel privateKeyLabel = new JLabel("私钥:   ");
        privateKeyArea = new JTextArea(2, 35); // 多行文本框，2行，35列
        privateKeyArea.setEditable(false);     // 设置为只读
        JScrollPane privateKeyScroll = new JScrollPane(privateKeyArea);
        privateKeyPanel.add(privateKeyLabel);
        privateKeyPanel.add(privateKeyScroll);

        // 创建按钮
        registerButton = new JButton("注册");
        exitButton = new JButton("退出");
        broadcastKeyButton = new JButton("广播公钥");

        // 注册按钮事件监听器
        registerButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String userId = userIdField.getText();
                // 在这里生成公私钥对并显示
                KeyPair keyPair1 = null;
                try {
                    keyPair1 = ECCKeyGen.generateKeyPair();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                PrivateKey sigKey1 = keyPair1.getPrivate();
                PublicKey pubKey1 = keyPair1.getPublic();
                String publicKeyStr = ECCKeyGen.publicKeyToBase64((ECPublicKey) pubKey1);
                String privateKeyStr = ECCKeyGen.privateKeyToBase64((ECPrivateKey) sigKey1);
                // 使用 SwingUtilities.invokeLater() 确保 UI 更新在 EDT 线程中 todo：未成功更新显示
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        publicKeyArea.setText(publicKeyStr);  // 设置公钥显示
                        privateKeyArea.setText(privateKeyStr); // 设置私钥显示
                    }
                });
                RegisterUI.this.dispose(); // 关闭注册界面、开启登录界面
                LoginUI loginUI = new LoginUI(userId,publicKeyStr, privateKeyStr);
                loginUI.setVisible(true);
            }
        });

        // 退出按钮事件监听器
        exitButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 退出应用
                System.exit(0);
            }
        });

        // 广播公钥按钮事件监听器
        broadcastKeyButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String publicKey = publicKeyArea.getText();
                // 这里可以添加广播公钥的逻辑
                System.out.println("广播公钥: " + publicKey);
            }
        });

        // 创建面板来水平放置按钮
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(registerButton);
        buttonPanel.add(exitButton);
        buttonPanel.add(broadcastKeyButton);

        // 添加组件到窗体
        add(userIdPanel);
        add(tipPanel);
        add(publicKeyPanel);
        add(privateKeyPanel);
        add(buttonPanel);  // 将按钮面板添加到窗口

        // 设置窗体居中显示
        setLocationRelativeTo(null);
    }

    // 假设一个生成公钥的方法，实际使用时可以替换为生成公钥的算法
    private String generatePublicKey(String userId) {
        return "公钥_" + userId;  // 这里模拟生成公钥
    }

    // 假设一个生成私钥的方法，实际使用时可以替换为生成私钥的算法
    private String generatePrivateKey(String userId) {
        return "私钥_" + userId;  // 这里模拟生成私钥
    }

    public static void main(String[] args) {
        // 在事件调度线程中启动应用程序
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // 创建并显示注册界面
                new RegisterUI().setVisible(true);
            }
        });
    }
}
